package com.gonsin.gview.logic.utils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class TypeUtils {

    /**
     * 是否支持该方法
     * @param p
     * @return
     */
    public static boolean isSupport(Type p, Type[] params) {
        for(Type type : params){
            String name1 = p.getTypeName();
            String name2 = type.getTypeName();
            if(p.getTypeName().equals(type.getTypeName())){
                return true;
            }
        }
        return false;
    }

    /**
     * 对象是否为属于某个type
     */
    public static boolean instanceOf(Object obj, Type type) {
        Type[] supType = obj.getClass().getGenericInterfaces();
        if(supType != null && supType.length > 0){
            for(Type t : supType){
                if(t.equals(type)){
                    return true;
                }
            }
        }
        Type parentType = obj.getClass().getGenericSuperclass();
        if(parentType != null){
            return parentType.equals(type);
        }
        return false;
    }

    /**
     * 对象是否为属于某个type
     */
    public static boolean isAssignable(Type left, Type type) {
        List<Type> allType = new ArrayList<>();
        allType.add(left);
        for(Type t : allType){
            if(t.equals(type)){
                return true;
            }
        }
        return false;
    }

    /**
     * 判断一个type是否为array
     * @param target
     * @return
     */
    public static boolean isArray(Type target) {
        if(target instanceof Class){
            return ((Class<?>) target).isArray();
        }
        return false;
    }


    /**
     * 获取一个List <> 里面的类
     * @param aClass
     * @return
     */
    public static Type getListSubType(Class<? extends List> aClass) {
        TypeVariable<? extends Class<? extends List>>[] types = aClass.getTypeParameters();
        if(types != null && types.length > 0){
            return types[0];
        }
        return null;
    }
}
